package com.saydc.actions.promociones;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.saydc.dao.EmpleadosDAO;
import com.saydc.dao.PromocionesDAO;
import com.saydc.dao.PuestosDAO;
import com.saydc.model.Empleado;
import com.saydc.model.EstadoPromocion;
import com.saydc.model.Promocion;
import com.saydc.model.Puesto;
import com.saydc.model.PuestoEspecifico;
import com.saydc.model.PuestoTrabajado;

public class ConfirmarPromocionAction extends Action {
	
	@SuppressWarnings("unchecked")
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		String tipo = request.getParameter("coleccion");
		List<Promocion> pendientes = (List<Promocion>)request.getSession().getAttribute("promocionesPendientes");
		List<Promocion> totales = (List<Promocion>)request.getSession().getAttribute("listaPromociones");
		int indiceLista = Integer.parseInt(request.getParameter("index"));
		
		Promocion buscada = null;
		if(tipo.equals("pendiente")){
			buscada = pendientes.get(indiceLista);
		}else if(tipo.equals("total")){
			buscada = totales.get(indiceLista);
		}
		
		Empleado empleadoPromocionado = buscada.getEmpleado();
		
		PuestoTrabajado puesto = new PuestoTrabajado();
		puesto.setData(empleadoPromocionado);
		PuestosDAO puestosDao = PuestosDAO.getInstance();
		puestosDao.guardarPuestoTrabajado(puesto);
		
		if(buscada.isExpertise()){
			if(checkRemuneracionExpertise(empleadoPromocionado, buscada) == false){
				empleadoPromocionado.setExpertise(buscada.getExpertisePromocion());
			}else{
				return mapping.findForward("expertiseFailure");
			}
		}else if(buscada.isPuesto()){
			if(checkRemuneracionPuesto(empleadoPromocionado, buscada) == false){
				empleadoPromocionado.setPuestoActual((PuestoEspecifico)buscada.getPuestoPromocion());
			}else{
				return mapping.findForward("pustoFailure");
			}
		}
		empleadoPromocionado.setRemuneracion(buscada.getRemuneracionPropuesta());

		empleadoPromocionado.getPuestosTrabajados().add(puesto);
		
		EmpleadosDAO empDao = EmpleadosDAO.getInstance();
		empDao.actualizaEmpleado(empleadoPromocionado);
		
		buscada.setEstadoPromocion(EstadoPromocion.getEstadoPromocion(EstadoPromocion.ACEPTADA));
		PromocionesDAO promoDao = PromocionesDAO.getInstance();
		promoDao.updatePromocion(buscada);
		
		return mapping.findForward("success");
	}

	private boolean checkRemuneracionExpertise(Empleado empleado, Promocion buscada){
		double remuneracion = buscada.getRemuneracionPropuesta();
		PuestoEspecifico puesto = empleado.getPuestoActual();
		double minima = puesto.getRemuneracionMinima();
		double maxima = puesto.getRemuneracionMaxima();
		if(remuneracion < minima || remuneracion > maxima){
			return true;
		}
		return false;
	}
	
	private boolean checkRemuneracionPuesto(Empleado empleado, Promocion buscada){
		double remuneracion = buscada.getRemuneracionPropuesta();
		Puesto puesto = buscada.getPuestoPromocion();
		double minima = puesto.getRemuneracionMinima();
		double maxima = puesto.getRemuneracionMaxima();
		if(remuneracion < minima || remuneracion > maxima){
			return true;
		}
		return false;
	}
}
